package style.Leetcode.初级算法.str.str_20221017_1_替换后的最长重复字符;

/**
 * 424. 替换后的最长重复字符
 * <p>
 * 给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符，并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。
 * 在执行上述操作后，返回包含相同字母的最长子字符串的长度。
 * <p>
 * 示例 1：
 * 输入：s = "ABAB", k = 2
 * 输出：4
 * 解释：用两个'A'替换为两个'B',反之亦然。
 * 示例 2：
 * 输入：s = "AABABBA", k = 1
 * 输出：4
 * 解释：
 * 将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
 * 子串 "BBBB" 有最长重复字母, 答案为 4。
 */
public class Solution {

    /**
     * 思路：
     * 双指针解法
     * 拿到一个窗口内最长的重复子串，判断加上 k 是否是最长的重复字符
     */
    public int characterReplacement(String s, int k) {
        int maxsame = 0;
        int len = s.length();
        int left = 0;
        // 模拟 hashmap
        int[] arr = new int[26];
        // 定义变量
        int right = 0;
        for (; right < len; right++) {
            // 得出索引，ASCLL 码
            int index = s.charAt(right) - 'A';
            // 数目加1， 因为我们要求窗口内最多元素
            arr[index]++;
            // 得出最大的 maxsame
            maxsame = Math.max(maxsame, arr[index]);
            // 不符合情况时，缩小窗口, 左移
            if (maxsame + k < right - left + 1) {
                arr[s.charAt(left) - 'A']--;
                left++;
            }
        }
        return right - left;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.characterReplacement("ABCD", 1));
    }
}
